<?php
/**
 * Created by PhpStorm.
 * User: Qch
 * Date: 2016/9/11
 * Time: 7:40
 */

namespace J\MVC;

use J\Exception;
use J\Message;
use J\Storage\Synchronizer;
use J\UI\Template;


/**
 * 这个类计划是处理模板缓存功能，可以是继承或组合模板类
 *
 */
class View
{
    /**
     * 渲染操作
     *
     * @param string $view 视图文件
     * @param string[] $virs 视图路径
     * @param array $arguments 模板参数
     *
     * @return string
     * @throws Exception
     */
    public static function display($view, $virs, $arguments = [])
    {
        $template = self::getView($virs, $view);

        return static::fetch($template, $arguments);
    }

    /**
     * 编译模板
     * @param $template
     * @param array $arguments
     * @return string
     * @throws Exception
     */
    public static function fetch($template, $arguments = [])
    {
        $storage = new Synchronizer('File', 'FileCache',
            function (
                /** @noinspection PhpUnusedParameterInspection */
                $value,
                $key
            ){
                return self::compile($key);
            },
            function ($key){
                return DEFAULT_TIR .DS .base64_encode($key);
            }
        );

        return $storage->get($template, $arguments);
    }

    /**
     * 自动搜索视图
     * @param [] $virs
     * @param string $view
     * @return string
     * @throws Exception
     */
    protected static function getView($virs, $view)
    {
        foreach ($virs as $path){
            $template = $path . DS . $view . '.html';
            if (is_file($template)) return $template;
            continue;
        }

        throw new Exception(Message::TEMPLATE_NOT_FIND);
    }

    /**
     * 根据模板文件和参数返回字符串
     *
     * @param string $template 模板文件
     *
     * @return string
     * @throws Exception
     */
    protected static function compile($template)
    {
        return app()->Engine()->fetch($template);
    }



}